package aInterview.xinye;

import listNodePractice.ListNode;

import java.util.List;

public class Main1 {

    public ListNode   reverse(ListNode head,int m,int n){
//        if (m>=n){
//            return  head;
//        }
//        ListNode pre=new ListNode(-1);
//        pre.next=head;
//        for (int i = 0; i < m-1; i++) {
//            pre=pre.next;
//        }
//
//        ListNode start_before=
//        ListNode cur=pre.next;
//        ListNode  next=pre.next;
//        for (int i = 0; i < n - m; i++) {
//             next=cur.next;
//             cur.next=pre
//
//        }
//        return  head;
        if (m>=n){
            return head;
        }
        //TODO:2023/11/5  start 为翻转区间开始的位置  start_before 为开始区间前一个元素 end_next 为翻转区间的后一个元素
        ListNode start=head;
        ListNode start_before=null;
        for (int i = 0; i < m-1; i++) {
            if (i==m-2){
                start_before=start;
            }
            start=start.next;
        }
        ListNode pre=null;
        ListNode cur=start;
        ListNode  next=start;
        for (int i = 0; i <=n-m; i++) {
           next= cur.next;
           cur.next=pre;
           pre=cur;
           cur=next;
        }
        ListNode end_next=next;
        start_before.next=pre;
        start.next=end_next;
        return  head;
    }

    //TODO:2023/11/5  自己突发奇想实现不了
//    public void  reverse1(ListNode  head){
//        if (head==null||head.next==null){
//            return;
//        }
//        ListNode pre=head;
//        ListNode cur=pre.next;
//        ListNode temp=cur.next;
//        cur.next=pre;
//        if (temp!=null){
//            reverse1(temp);
//        }
//    }

    //TODO:2023/11/5   似乎真的开始理解啦 哈哈哈
    public ListNode  reverse1(ListNode  head) {
       ListNode pre,cur,next;
       pre=null;
       cur=next=head;
       while (cur!=null){
           next=cur.next;
           cur.next=pre;
           pre=cur;
           cur=next;
       }
       return  pre;
    }

    //TODO:2023/11/4java  给出  将一个链表中所有的偶数节
    // 点合并到该节点前面和它相邻的奇数节点上，新节点权值为两节点权值之和，直到剩余节点无法合并 递归的形式

    public static ListNode mergeEvenWithOdd1(ListNode head) {
        if (head == null || head.next == null) {
            return null;
        }
        //TODO:2023/11/6   11 月4日使用递归的形式   6日回顾
        ListNode pre = head;
        ListNode cur = pre.next;
        if (cur.val % 2 == 0) {
            if (pre.val % 2 == 1) {
                pre.val = pre.val + cur.val;
                ListNode temp = cur.next;
                pre.next = temp;
                mergeEvenWithOdd1(temp);
            } else {
                mergeEvenWithOdd1(cur.next);
            }
        } else {
            mergeEvenWithOdd1(cur);
        }
        return head;
    }

    //TODO:2023/11/6
    // 给定单链表的头节点 head ，将所有索引为奇数的节点和索引为偶数的节点分别组合在一起，然后返回重新排序的列表。
    // 第一个节点的索引被认为是 奇数 ， 第二个节点的索引为 偶数 ，以此类推。
//
//        请注意，偶数组和奇数组内部的相对顺序应该与输入时保持一致。
//
//        你必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。
    public ListNode oddEvenList(ListNode head) {

        ListNode  oddHead=head;
        ListNode evenHead=head.next;
        ListNode oddNode=oddHead;
        ListNode evenNode=evenHead;

//        while (odd!=null&&even!=null){
////            odd.next=even.next;
////            even.next=odd.next.next;
////            odd=odd.next;
////            even=even.next;
////        }

        boolean  flag=true;
        for(ListNode  node=evenNode.next;node!=null;node=node.next){
            if (flag){
                oddNode.next=node;
                oddNode=oddNode.next;
            }else {
                evenNode.next=node;
                evenNode=evenNode.next;
            }
            //TODO:2023/11/6  取反的妙处 一直轮询取反 true  false true false 交替
            flag=!flag;
        }
        return  oddHead;
    }








    public static void main(String[] args) {
        Main1 main1 = new Main1();
        ListNode head = new ListNode(1);
        head.next=new ListNode(2);
        head.next.next=new ListNode(3);
        head.next.next.next=new ListNode(4);
        head.next.next.next.next=new ListNode(5);
        ListNode now= main1.reverse(head,2,4);
        while (now!=null){
            System.out.println(now.val);
          now=now.next;
        }

    }

}
